#include <assert.h>
#include <malloc.h>
#include "mario.h"
#include "assert.h"

void marioInit(mario* mario, const int x, const int y)
{
    /*Initialise les coordonnées initiales de Mario sur le terrain. */
    mario->x = x;
    mario->y = y;
    /* nombre de points de vie */
    mario->tabBonus[0]=2;
    /* nombre de bombes dispo */
    mario->tabBonus[1]=2;
    /* vitesse de mario */
    mario->tabBonus[2]=1;
    /*puissance des bombes */
    mario->tabBonus[3]=0;
    /* invicibilité */
    mario->tabBonus[4]=0;
    mario->heureInvincibilite = 0;
}

void marioGauche(mario* mario, const terrain* ter)
{
    if (terrainPositionValide(ter, marioGetX(mario)-1, marioGetY(mario)))
        mario->x--;
}

void marioDroite(mario* mario, const terrain* ter)
{
    if (terrainPositionValide(ter, marioGetX(mario)+1, marioGetY(mario)))
        mario->x++;
}

void marioBas(mario* mario, const terrain* ter)
{
    if (terrainPositionValide(ter, marioGetX(mario), marioGetY(mario)+1))
        mario->y++;
}

void marioHaut(mario* mario, const terrain* ter)
{
    if (terrainPositionValide(ter, marioGetX(mario), marioGetY(mario)-1))
        mario->y--;
}
void poseBombe(mario* mario, terrain* ter, const int numJoueur) /* numJoueur = 1 pour mario, 2 pour luigi */
{
    assert(mario);
    assert(ter);
    if (mario->tabBonus[1] > 0)
    {
        bombe* bombe = bombeInit(ter, marioGetX(mario), marioGetY(mario), mario->tabBonus[3], numJoueur);
        bombeAffiche(bombe, ter);
        mario->tabBonus[1]--;
    }
}

int marioGetX(const mario* mario)
{
    return mario->x;
}

int marioGetY(const mario* mario)
{
    return mario->y;
}

void marioSetBonus(mario* mario, const int codeBonus)
{
    switch(codeBonus)
    {
        case 0 : if(mario->tabBonus[0] < 4) /* augmente le nombre de vies */
                    mario->tabBonus[0]++; break;
        case 1 : if (mario->tabBonus[1] < 3) /* le nombre de bombes */
                    mario->tabBonus[1]++; break;
        case 2 : mario->tabBonus[2]++; break; /* la vitesse de Mario */
        case 3 : if (mario->tabBonus[3] < 1)  /* la puissance des bombes */
                    mario->tabBonus[3]++;
                break;
        case 4 : mario->tabBonus[4] = 1;      /* l'invincibilité */
                mario->tabBonus[0] = 500;
                mario->heureInvincibilite = time(&mario->heureInvincibilite);
                break;
        /* pour supprimer l'invincibilité */
        case 5 : mario->tabBonus[4] = 0; break;
        case 6 : mario->tabBonus[0] = 2; break;
    }
}

void marioLibere(mario* mario)
{
    mario = 0;
}
